import { EventEmitter } from "@/framework/util/event-emitter.ts";

/**
 * 任务状态
 */
export interface TaskStatus {
  /**
   * 状态值
   */
  state?: string;
  /**
   * 状态描述
   */
  desc: string;
  /**
   * 状态详情
   */
  detail?: string;
}

export interface TaskItemEvents {
  /**
   * 任务执行完成
   */
  complete: void;
  /**
   * 取消任务
   */
  cancel: void;
}

/**
 * 任务项
 */
export abstract class TaskItem extends EventEmitter<TaskItemEvents> {
  /**
   * 任务状态
   */
  status: TaskStatus | null = null;
  /**
   * 任务进度
   */
  percent = 0;
  /**
   * 任务速度
   */
  speedDisplay: string | null = null;
  /**
   * 任务总量显示
   */
  totalDisplay: string | null = null;
  /**
   * 已处理数据显示
   */
  processedDisplay: string | null = null;

  /**
   * 任务执行异常
   */
  isError = false;
  /**
   * 异常信息
   */
  error?: string;

  /**
   * @param id 任务ID
   * @param name 任务名称
   */
  protected constructor(
    readonly id: string,
    readonly name: string,
  ) {
    super();
  }

  /**
   * 开始任务
   */
  async start() {
    this.isError = false;
    this.error = "";

    try {
      await this.run();
    } catch (e: any) {
      this.isError = true;
      this.error = e?.message ?? e?.toString();
      console.error(e);
      this.onRunError?.(e);
    } finally {
      this.onRunFinally?.();
    }
  }

  /**
   * 执行任务内容
   * @protected
   */
  protected abstract run(): Promise<void>;

  /**
   * 任务执行异常
   * @param e 异常对象
   * @protected
   */
  protected onRunError?(e?: any): void;

  /**
   * 任务结束最后执行的逻辑
   * @protected
   */
  protected onRunFinally?(): void;

  /**
   * 取消任务
   */
  cancel() {
    this.handleCancel?.();
    this.emit("cancel");
  }

  /**
   * 取消任务处理逻辑
   * @protected
   */
  protected handleCancel?(): void;
}
